package q1.project.common.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 租户ID验证工具类 用于验证租户ID是否有效，禁止使用无效的租户ID（如"default"）
 *
 * @author Q1 Team
 * @version 1.0
 */
public class TenantValidator {

  private static final Logger log = LoggerFactory.getLogger(TenantValidator.class);

  /** 无效的租户ID列表（禁止使用） */
  private static final String[] INVALID_TENANT_IDS = {
    "default", "null", "undefined", "none", "system", "SYSTEM", "admin", "ADMIN"
  };

  /**
   * 验证租户ID是否有效
   *
   * @param tenantId 租户ID
   * @return true-有效，false-无效
   */
  public static boolean isValid(String tenantId) {
    if (tenantId == null || tenantId.trim().isEmpty()) {
      return false;
    }

    // 检查是否为禁止使用的租户ID
    for (String invalidId : INVALID_TENANT_IDS) {
      if (invalidId.equalsIgnoreCase(tenantId.trim())) {
        log.warn("检测到禁止使用的租户ID: {}", tenantId);
        return false;
      }
    }

    // 基本格式验证：长度、字符等
    String trimmed = tenantId.trim();
    if (trimmed.length() > 32) {
      log.warn("租户ID长度超过限制: {}", tenantId);
      return false;
    }

    // 不能包含特殊字符（可根据需求调整）
    if (trimmed.contains(" ") || trimmed.contains("\n") || trimmed.contains("\r")) {
      log.warn("租户ID包含非法字符: {}", tenantId);
      return false;
    }

    return true;
  }

  /**
   * 验证并抛出异常（如果无效）
   *
   * @param tenantId 租户ID
   * @throws IllegalArgumentException 如果租户ID无效
   */
  public static void validateOrThrow(String tenantId) {
    if (!isValid(tenantId)) {
      throw new IllegalArgumentException(
          "无效的租户ID: " + tenantId + "。禁止使用 'default'、'null'、'system' 等保留值");
    }
  }

  /**
   * 验证并抛出异常（如果无效），包含上下文信息
   *
   * @param tenantId 租户ID
   * @param context 上下文信息（用于错误日志）
   * @throws IllegalArgumentException 如果租户ID无效
   */
  public static void validateOrThrow(String tenantId, String context) {
    if (!isValid(tenantId)) {
      String message =
          String.format(
              "无效的租户ID: %s（上下文: %s）。禁止使用 'default'、'null'、'system' 等保留值", tenantId, context);
      log.error(message);
      throw new IllegalArgumentException(message);
    }
  }
}
